NLP

Multi-Level Memory for Task Oriented Dialogs

本文提出了基于多层记忆网络的对话生成模型,创新点在于将context memory和KB memory分隔开,并且以一种分层的结构表示KB memory,以符合KB结果中自然的层次关系,使得模型可以支持非连续的对话(用户引用之前历史提过的KB结果),在entity F1和BLEU上远远超过之前的模型(Mem2Seq等)。

paper link
code link

Introduction

本文要解决的是结合KB的任务型对话生成问题(见表1)。

传统的模型如Mem2Seq等存在以下问题:

  1. KB结果和对话上下文存储在同一个记忆网络中,这使得模型很难区分这两者,从而基于memory进行推理变得困难。
  2. 当前所有的模型都是以三元组的形式存储KB(subject - relation - object),这使得很难去推断不同属性之间的关系。

    For instance, consider the example triple store in Table 2 showing results for a query executed for packages between “Dallas” and “Mannheim”. If the user asks the dialog agent to check the price of stay at a 5 star hotel, the memory reader needs to infer that the correct answer is $2800 by learning that the price, category and hotel need to be linked inorder to return an answer (shown in blue).

  3. 把对话当作连续过程,仅仅建模最近的用户query,没有考虑对话过程中用户的切换。

本文的创新点在于:

  1. 将上下文和KB结果存储在不同的记忆网络
  2. 舍弃传统的三元组结构,以multi-level memory来存储利用KB结果
  3. 在三个公开数据集上取得了远远优于之前模型的效果

Multi-Level Memory Network

模型包括三个部分:

  • 分层编码器
  • 多层记忆网络
  • 解码器

Encoder

Encoder是一个分层编码器,由两层GRU组成。给定$t^{th}$轮的上下文$\left(c_{1}, c_{2}, \dots c_{2 t-1}\right)$,其中包括t轮的user utterance和t-1轮的system utterance,$c_{i}$由词序列组成$\left(w_{i 1}, w_{i 2}, \dots w_{i m}\right)$。首先由单层双向GRU获取序列$c_{i}$的表示$\varphi\left(c_{i}\right)$,然后将所有序列表示通过另一个GRU获取输入上下文表示c。

Multi-level Memory

Memory Representation

假设$q_{1}, q_{2}, \ldots q_{k}$是当前对话状态出现过的所有user queries,其中的每一个query $q_{i}$ 都是key-value pairs集合 $\left\{k_{a}^{q_{i}} : v_{a}^{q_{i}}, 1<a<n_{q_{i}}\right\}$,$n_{q_{i}}$是slot的数目。例如表1中第三轮对应的query是{’origin’:’Dallas’,’destination’:’Manheim’,’Start’: ’Aug 26’, ’end’: ’Aug 31’, ’Adults’:1}。一个query查询KB后可以得到结果集合,$r_{ij}$是query $q_{i}$ 对应的 $j^{th}$ 个结果,每一个结果也是key-value pairs $\left\{k_{a}^{r_{i j}} : v_{a}^{r_{i j}}, 1<a<n_{r_{i j}}\right\}$,$n_{\boldsymbol{r}_{i j}}$是属性总数,示例可见图1c。

memory分为三层,分别存储query representation、result representation、key-value pair representation。query representation由query $q_{i}$ 中所有的value $v_{a}^{q_{i}}$ 的词向量的词袋模型生成,记为$q_{i}^{v}$。第二层memory存储的是每个查询结果$r_{ij}$对应的表示$r_{ij}^{v}$,也是通过结果中所有的value的词向量的词袋模型生成。第三层memory存储的是结果$r_{ij}$中的一个key-value pair $\left(k_{a}^{r_{i j}} : v_{a}^{r_{i j}}\right)$ 的表示,其中value $\left(v_{a}^{r_{i j}}\right)$ 是在生成系统回复时可能会被拷贝复制的词,实际中存储的是 $k_{a}^{r_{i j}}$ 的词向量。

Decoder

解码器每次生成一个词,来自于词汇表分布或者由context memory or KB memory 复制得到,通过门控机制$g_{1}$ 来控制词汇表分布和memory分布,通过门控$g_{2}$来控制两个memory分布。

Generating words

$$
h_{t}=G R U\left(\phi^{c m b}\left(y_{t-1}\right), h_{t-1}\right)
$$
$h_{t}$ 是解码器t时刻的隐层状态,使用$h_{t}$对context memory做注意力:
$$
a_{i j}=\frac{\exp \left(w_{1}^{T} \tanh \left(W_{2} \tanh \left(W_{3}\left[h_{t}, h_{i j}^{e}\right]\right)\right)\right)}{\sum_{i j} \exp \left(w_{1}^{T} \tanh \left(W_{2} \tanh \left(W_{3}\left[h_{t}, h_{i j}^{e}\right]\right)\right)\right)}
$$
其中i代表第i个utterance,j代表第j个词,$h_{ij}^{e}$是GRU编码后的隐层状态。
$$
d_{t}=\sum_{i, j} a_{i, j} h_{i j}^{e}
$$
最终得到生成的概率分布:
$$
P_{g}\left(y_{t}\right)=\operatorname{softmax}\left(W_{1}\left[h_{t}, d_{t}\right]+b_{1}\right)
$$

Copying words from context memory

以注意力分布作为从context memory复制词的概率:
$$
P_{c o n}\left(y_{t}=w\right)=\sum_{i j : w_{i j}=w} a_{i j}
$$

Copying entries from KB memory

使用context representation $d_{t}$和decoder hidden state $h_{t}$ 计算多层KB memory注意力,第一层注意力是对query $q_{i}^{v}$做注意力:
$$
\alpha_{i}=\frac{\exp \left(w_{2}^{T} \tanh \left(W_{4}\left[d_{t}, h_{t}, q_{i}^{v}\right]\right)\right)}{\sum_{i} \exp \left(w_{2}^{T} \tanh \left(W_{4}\left[d_{t}, h_{t}, q_{i}^{v}\right]\right)\right)}
$$
第二层是对结果 $r_{ij}^{v}$做注意力:
$$
\beta_{i j}=\frac{\exp \left(w_{3}^{T} \tanh \left(W_{5}\left[d_{t}, h_{t}, r_{i j}^{v}\right]\right)\right)}{\sum_{j} \exp \left(w_{3}^{T} \tanh \left(W_{5}\left[d_{t}, h_{t}, r_{i j}^{v}\right]\right)\right)}
$$
第三层是对结果$r_{ij}$中的一个key-value pair $\left(k_{a}^{r_{i j}} : v_{a}^{r_{i j}}\right)$做注意力:
$$
\gamma_{i j l}=\frac{\exp \left(w_{4}^{T} \tanh \left(W_{6}\left[d_{t}, h_{t}, \phi^{c m b}\left(k_{l}^{r_{i j}}\right)\right]\right)\right)}{\sum_{l} \exp \left(w_{4}^{T} \tanh \left(W_{6}\left[d_{t}, h_{t}, \phi^{\operatorname{cmb}}\left(k_{l}^{r_{i j}}\right)\right]\right)\right)}
$$
$\phi^{cmb}(k_{l}^{r_{ij}})$ 代表key的词向量。将三层注意力分数结合起来:
$$
P_{k b}\left(y_{t}=w\right)=\sum_{i j l : v_{l}^{r_{i j}}} \alpha_{i} \beta_{i j} \gamma_{i j l}
$$

Decoding

解码时通过门控机制来得到从memory复制词的概率分布$P_{c}(y_{t})$:
$$
m_{t}=\sum_{i} \sum_{j} \alpha_{i} \beta_{i j} r_{i j}^{v}\\
\begin{array}{c}{g_{2}=\operatorname{sigmoid}\left(W_{7}\left[h_{t}, d_{t}, m_{t}\right]+b_{2}\right)} \\ {P_{c}\left(y_{t}\right)=g_{2} P_{k b}\left(y_{t}\right)+\left(1-g_{2}\right) P_{c o n}\left(y_{t}\right)}\end{array}
$$
然后使用另一个门控$g_{1}$来得到最终的概率分布$P(y_{t})$:
$$
\begin{array}{l}{g_{1}=\operatorname{sigmoid}\left(W_{8}\left[h_{t}, d_{t}, m_{t}\right]+b_{3}\right)} \\ {P\left(y_{t}\right)=g_{1} P_{g}\left(y_{t}\right)+\left(1-g_{1}\right) P_{c}\left(y_{t}\right)}\end{array}
$$
使用交叉熵损失函数$-\sum_{t=1}^{T} \log \left(P\left(y_{t}\right)\right)$。

Experiments

Datasets

论文使用了三个数据集:the InCar assistant (Eric and Manning, 2017), CamRest (Su et al., 2016) and the
Maluuba Frames dataset (El Asri et al., 2017)。

Results

Table  4:  Comparison  of  our  model  with  baselines

Table  6:  Model  ablation  study  :  Effect  of  (i)  separate  memory  and  (ii)  multi-level  memory  design.

Table  7:  Informational  accuracy  and  language  quality scores  using  a  human  study.

Table  8:  Comparing  the  responses  generated  by  various models  on  an  example  in  test  set  of  Maluuba  Frames.

Conclusion

本文提出了基于多层记忆网络的对话生成模型,创新点在于将context memory和KB memory分隔开,并且以一种分层的结构表示KB memory,以符合KB结果中自然的层次关系,使得模型可以支持非连续的对话(用户引用之前历史提过的KB结果),在entity F1和BLEU上远远超过之前的模型(Mem2Seq等)。论文也提到,在比较复杂的Maluuba Frames dataset上所有模型的效果都不好,这说明需要更好的对对话frame建模。